/**
 * 公共工具函数
 */

const { ipcRenderer } = require('electron');
const log = require('electron-log');
const path = require('path');

// 从环境变量或使用默认值获取服务器URL
const SERVER_HOST = process.env.SERVER_HOST || 'drive.kbin.cc';
const SERVER_PORT = process.env.SERVER_PORT || '3000';
const SERVER_PROTOCOL = process.env.SERVER_PROTOCOL || 'http';
const SERVER_URL = `${SERVER_PROTOCOL}://${SERVER_HOST}:${SERVER_PORT}`;

/**
 * 获取资源文件路径（处理打包后的路径问题）
 * @param {string} relativePath - 相对于assets目录的路径，如 'avatar.png'
 * @returns {string} 完整的文件路径
 */
function getAssetPath(relativePath) {
  // 确保相对路径不以斜杠开头
  const cleanPath = relativePath.replace(/^[\/\\]+/, '');
  
  // 在开发环境和打包后都能正确工作的路径
  const assetPath = path.join(__dirname, '../assets', cleanPath);
  
  // 转换为file://协议URL（适用于img标签的src）
  return assetPath.replace(/\\/g, '/');
}

/**
 * 显示通知
 */
function showNotification(message, type = 'info') {
  const notification = document.createElement('div');
  notification.className = `notification ${type}`;
  notification.textContent = message;
  document.body.appendChild(notification);

  setTimeout(() => {
    notification.style.animation = 'slideOut 0.3s ease-in forwards';
    setTimeout(() => notification.remove(), 300);
  }, 3000);

  log.info(`通知[${type}]: ${message}`);
}

/**
 * 格式化文件大小
 */
function formatFileSize(bytes) {
  if (bytes === 0) return '0 B';
  const k = 1024;
  const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
}

/**
 * 格式化速度
 */
function formatSpeed(bytesPerSecond) {
  return formatFileSize(bytesPerSecond) + '/s';
}

/**
 * 格式化日期
 */
function formatDate(dateString) {
  if (!dateString) return '';
  const date = new Date(dateString);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hour = String(date.getHours()).padStart(2, '0');
  const minute = String(date.getMinutes()).padStart(2, '0');
  return `${year}-${month}-${day} ${hour}:${minute}`;
}

/**
 * 获取文件图标
 */
function getFileIcon(filename) {
  const ext = filename.split('.').pop().toLowerCase();
  
  // 图片文件使用SVG图标
  const imageExts = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tif', 'tiff'];
  if (imageExts.includes(ext)) {
    return '<img src="./assets/Photo.svg" alt="图片文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // 视频文件使用SVG图标
  const videoExts = ['mp4', 'avi', 'mkv', 'mov', 'wmv', 'flv', 'webm', 'm4v', 'mpg', 'mpeg'];
  if (videoExts.includes(ext)) {
    return '<img src="./assets/Video.svg" alt="视频文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // 链接文件使用SVG图标
  const linkExts = ['url', 'lnk', 'link', 'webloc', 'desktop'];
  if (linkExts.includes(ext)) {
    return '<img src="./assets/Url.svg" alt="链接文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // 音乐文件使用SVG图标
  const musicExts = ['mp3', 'wav', 'flac', 'aac', 'm4a', 'ogg', 'wma', 'ape', 'alac'];
  if (musicExts.includes(ext)) {
    return '<img src="./assets/Music.svg" alt="音乐文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // 表格文件使用SVG图标
  const spreadsheetExts = ['xls', 'xlsx', 'xlsm', 'csv', 'ods'];
  if (spreadsheetExts.includes(ext)) {
    return '<img src="./assets/Xls.svg" alt="表格文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // Word文档使用SVG图标
  const wordExts = ['doc', 'docx', 'docm', 'dot', 'dotx', 'odt'];
  if (wordExts.includes(ext)) {
    return '<img src="./assets/Word.svg" alt="Word文档" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // 文本文件使用SVG图标
  const textExts = ['txt', 'text', 'log'];
  if (textExts.includes(ext)) {
    return '<img src="./assets/Txt.svg" alt="文本文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // 压缩文件使用SVG图标
  const archiveExts = ['zip', 'rar', '7z', 'tar', 'gz', 'bz2', 'xz', 'iso'];
  if (archiveExts.includes(ext)) {
    return '<img src="./assets/Zip.svg" alt="压缩文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // 代码文件使用SVG图标
  const codeExts = ['js', 'jsx', 'ts', 'tsx', 'py', 'java', 'c', 'cpp', 'h', 'hpp', 'cs', 'php', 'rb', 'go', 'rs', 'swift', 'kt', 'vue', 'html', 'css', 'scss', 'sass', 'less', 'json', 'xml', 'yaml', 'yml', 'sh', 'bash', 'md', 'markdown'];
  if (codeExts.includes(ext)) {
    return '<img src="./assets/Dm.svg" alt="代码文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // 配置文件使用SVG图标
  const configExts = ['ini', 'conf', 'config', 'cfg', 'properties', 'env', 'toml', 'editorconfig', 'npmrc', 'gitignore'];
  if (configExts.includes(ext)) {
    return '<img src="./assets/Pz.svg" alt="配置文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // 文件夹
  if (isDir) {
    return '<img src="./assets/Folder.svg" alt="文件夹" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // PDF文件使用SVG图标
  if (ext === 'pdf') {
    return '<img src="./assets/PDF.svg" alt="PDF文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // PPT文件使用SVG图标
  const pptExts = ['ppt', 'pptx', 'pptm', 'potx', 'ppsx'];
  if (pptExts.includes(ext)) {
    return '<img src="./assets/PPT.svg" alt="PPT文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // 3D模型文件使用SVG图标
  const modelExts = ['obj', 'fbx', '3ds', 'stl', 'dae', 'gltf', 'glb', 'blend', 'max', 'c4d', 'ma', 'mb'];
  if (modelExts.includes(ext)) {
    return '<img src="./assets/3D.svg" alt="3D模型" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // 数据库文件使用SVG图标
  const dbExts = ['sql', 'db', 'sqlite', 'sqlite3', 'mdb', 'accdb', 'dbf', 'sdf'];
  if (dbExts.includes(ext)) {
    return '<img src="./assets/sql.svg" alt="数据库文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
  }
  
  // 其他所有文件使用404.svg图标
  return '<img src="./assets/404.svg" alt="未知文件" style="width: 20.16px; height: 20.16px; vertical-align: middle;">';
}

/**
 * 获取用户数据
 */
function getUserData() {
  try {
    const token = localStorage.getItem('token');
    const user = localStorage.getItem('user');
    
    console.log('getUserData - token:', token ? '存在' : '不存在');
    console.log('getUserData - user:', user ? '存在' : '不存在');
    
    if (!token || !user) {
      console.log('getUserData - 返回null（token或user缺失）');
      return null;
    }
    
    const userData = {
      token,
      user: JSON.parse(user)
    };
    
    console.log('getUserData - 成功返回用户数据:', userData.user.username);
    return userData;
  } catch (error) {
    console.error('getUserData - 解析用户数据失败:', error);
    // 清除损坏的数据
    localStorage.removeItem('token');
    localStorage.removeItem('user');
    return null;
  }
}

/**
 * 保存用户数据
 */
function saveUserData(userData) {
  try {
    console.log('saveUserData - 保存用户:', userData.user.username);
    localStorage.setItem('token', userData.token);
    localStorage.setItem('user', JSON.stringify(userData.user));
    console.log('saveUserData - 保存成功');
  } catch (error) {
    console.error('saveUserData - 保存失败:', error);
  }
}

/**
 * 清除用户数据
 */
function clearUserData() {
  localStorage.removeItem('token');
  localStorage.removeItem('user');
}

/**
 * 检查是否已登录
 */
function isLoggedIn() {
  return !!getUserData();
}

/**
 * HTTP请求封装
 */
async function request(url, options = {}) {
  const userData = getUserData();
  
  const defaultHeaders = {
    'Content-Type': 'application/json'
  };
  
  if (userData) {
    defaultHeaders['Authorization'] = `Bearer ${userData.token}`;
  }
  
  const response = await fetch(`${SERVER_URL}${url}`, {
    ...options,
    headers: {
      ...defaultHeaders,
      ...options.headers
    }
  });
  
  const result = await response.json();
  
  // 处理401未授权
  if (response.status === 401) {
    clearUserData();
    navigateToPage('login');
    throw new Error('未授权，请重新登录');
  }
  
  return result;
}

/**
 * 窗口控制
 */
function setupWindowControls() {
  document.getElementById('minimize-btn')?.addEventListener('click', () => {
    ipcRenderer.send('app-minimize');
  });

  document.getElementById('maximize-btn')?.addEventListener('click', () => {
    ipcRenderer.send('app-maximize');
  });

  document.getElementById('close-btn')?.addEventListener('click', () => {
    ipcRenderer.send('app-quit');
  });
}

/**
 * 导航到页面
 */
function navigateToPage(pageName) {
  // 如果是登录后跳转到主页，使用新的 base.html
  if (pageName === 'main') {
    window.location.href = 'base.html';
    log.info(`导航到新架构主页: base.html`);
    return;
  }
  
  // 其他页面保持原有逻辑（兼容性）
  const currentPath = window.location.pathname;
  const isInPages = currentPath.includes('/pages/');
  
  if (isInPages) {
    window.location.href = `${pageName}.html`;
  } else {
    window.location.href = `pages/${pageName}.html`;
  }
  
  log.info(`导航到页面: ${pageName}`);
}

module.exports = {
  SERVER_URL,
  getAssetPath,
  showNotification,
  formatFileSize,
  formatSpeed,
  formatDate,
  getFileIcon,
  getUserData,
  saveUserData,
  clearUserData,
  isLoggedIn,
  request,
  setupWindowControls,
  navigateToPage
};
